package business;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 *
 * @author Eduardo
 */
public class SM {

    private int option;        
    private Index index;    

    public SM()
    {
        this.index = new Index();
    }       

    public void addFile(String fileName, String filePath)
    {        
        try
        {
            long t0 = System.currentTimeMillis();

            //Leemos el fichero completo y lo metemos en un string para poderlo separar en documentos
            InputStream in = new BufferedInputStream(new FileInputStream("..\\temp\\" + fileName));
            InputStreamReader reader = new InputStreamReader(in);           
            char[] buffer = new char[400];           
            int readChars = 0;
            StringBuffer sBuffer = new StringBuffer(400);

                        
            while(reader.ready())
            {
                readChars = reader.read(buffer);
                if(readChars>0)
                    sBuffer.append(buffer, 0, readChars);
            }
            String text = sBuffer.toString();
            reader.close();
            in.close();
           
            //Aniadmos el fichero a la lista de ficheros indexados
            index.files.add(fileName);

            //Controlamos el numero de bytes leidos en cada documento
            //para identificar la zona en donde comienza el texto del documento
            //y asi buscarlo en el fichero fisico
            int readBytes = 0;

            //Cada ".I" es un nuevo documento, asi que delimitamos por el            
            MiStringTokenizer sTokenizer = new MiStringTokenizer(text, ".I");
            sTokenizer.nextToken();  //Este lee lo que esta antes de la I, que es un punto           
            
            while(sTokenizer.hasMoreTokens())
            {                                
                String sText = sTokenizer.nextToken().toLowerCase();                

                Document doc = new Document();
                doc.setFileId(index.files.size() - 1);
                doc.setInitialPosicion(readBytes);
                readBytes += sText.length() + 2;
                doc.setLength(readBytes - doc.getInitialPosicion());

                //Aniadimos el Id al documento
                int posId = sText.indexOf(".");
                //System.out.println("ID: " + sText.substring(0, posId).trim());
                doc.setId(Integer.parseInt(sText.substring(0, posId).trim()));
                sText = sText.substring(posId+4);

                //Aniadimos el titulo al documento
                int posTittle = sText.indexOf("\r\n");
                //System.out.println("TITLE: " + sText.substring(0, posTittle).trim());
                doc.setTittle(sText.substring(0, posTittle).trim());
                if(doc.getTittle().substring(doc.getTittle().length() - 1).equals("."))
                    doc.setTittle(doc.getTittle().substring(0, doc.getTittle().length() - 2));

                sText = sText.substring(posTittle+2);

                //Aniadimos el documento a la lista e indexamos su titulo y contenido
                index.addDocumentToIndex(doc, sText.substring(0, sText.length()-1));
            }

            long tf = System.currentTimeMillis();
            System.out.println("Tiempo Indexacion: " + (tf - t0) + " mseg");
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally
        {
            //Borramos el fichero temporal
            File f = new File("..\\temp\\" + fileName);
            f.delete();
        }
    }

    
    public List search(String searchText)
    {
        return index.search(searchText.toLowerCase());
    }

    public Document getDocumentById(int idDoc)
    {
        return this.index.getDocumentById(idDoc);
    }

    public String indexToString()
    {
        return this.index.toString();
    }

    public boolean isEmpty()
    {
        return index.isEmpty();
    }

    public String getFileName(int fileId)
    {
        return index.files.get(fileId);
    }

    public String getDocumentText(Document doc)
    {
        RandomAccessFile rndFile = null;
        try
        {
            //Document doc = index.documents.get(idDoc - 1);

            String namePROP = SM.class.getSimpleName().toLowerCase() + ".properties";
            Properties props = new Properties();
            props.load(SM.class.getResourceAsStream(namePROP));
            String filePath = props.getProperty("path");

            rndFile  = new RandomAccessFile(filePath + "\\" + index.files.get(doc.getFileId()), "r");
            rndFile.skipBytes(doc.getInitialPosicion());
            byte[] t = new byte[1000000];
            rndFile.read(t, 0, doc.getLength());

            //Tokenizamos para separar el texto de las cabeceras
            MiStringTokenizer st = new MiStringTokenizer(new String (t), ".W");
            st.nextToken();

            return st.nextToken();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
        finally {
            try {
                rndFile.close();                
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    public ArrayList<String> getCleanQuery(String searchWord)
    {
        return index.getCleanQuery(searchWord);
    }

    public void saveIndex()
    {
        this.index.saveIndex();
    }
    public void loadIndex()
    {
        this.index.loadIndex();
    }
}
